package com.xxx.mall.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xxx.mall.constant.StatusEnum;
import com.xxx.mall.converter.SpuConverter;
import com.xxx.mall.dto.SkuDTO;
import com.xxx.mall.mapper.SkuMapper;
import com.xxx.mall.model.Sku;
import com.xxx.mall.model.SkuStock;
import com.xxx.mall.model.SpuSkuAttrValue;
import com.xxx.mall.service.SkuService;
import com.xxx.mall.service.SkuStockService;
import com.xxx.mall.service.SpuSkuAttrValueService;
import com.xxx.mall.vo.SkuVO;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * sku信息 服务实现类
 * </p>
 *
 * @author 邢晨旭
 * @since 2023-11-24
 */
@Service
public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements SkuService {

    @Resource
    SpuConverter spuConverter;

    @Resource
    SkuStockService skuStockService;

    @Resource
    SpuSkuAttrValueService spuSkuAttrValueService;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addSkus(Long spuId, List<SkuDTO> skuList) {
        skuList.forEach(sku -> {
            sku.setSpuId(spuId);
            sku.setStatus(StatusEnum.ENABLE.value());
        });
        //保存sku
        baseMapper.saveBatch(skuList);
        List<SkuStock> skuStocks = new ArrayList<>();
        List<SpuSkuAttrValue> spuSkuAttrValues = new ArrayList<>();
        skuList.forEach(sku -> {
            //保存库存信息
            SkuStock skuStock = new SkuStock();
            skuStock.setSkuId(sku.getSkuId());
            skuStock.setStock(sku.getStock());
            skuStock.setActualStock(sku.getStock());
            skuStock.setLockStock(0);
            skuStocks.add(skuStock);
            //保存sku规格属性
            List<SpuSkuAttrValue> spuSkuAttrValue = spuConverter.toSpuSkuAttrValue(sku.getSpuSkuAttrValues());
            spuSkuAttrValue.forEach(attrValue -> {
                attrValue.setSpuId(spuId);
                attrValue.setSkuId(sku.getSkuId());
                attrValue.setStatus(StatusEnum.ENABLE.value());
                spuSkuAttrValues.add(attrValue);
            });
        });
        skuStockService.saveBatch(skuStocks);
        spuSkuAttrValueService.saveBatch(spuSkuAttrValues);
    }

    @Override
    public List<SkuVO> queryListBySpuId(Long id) {
        return baseMapper.queryListBySpuId(id);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSkus(Long spuId, List<SkuDTO> skuList) {
        SkuService proxy = (SkuService) AopContext.currentProxy();
        List<SkuVO> skuListDb = baseMapper.queryListBySpuId(spuId);
        List<Long> skuIdsDb = skuListDb.stream().map(SkuVO::getSkuId).collect(Collectors.toList());
        List<SkuDTO> updateSkus = new ArrayList<>();
        List<SkuDTO> insertSkus = new ArrayList<>();
        for (SkuDTO sku : skuList) {
            sku.setSpuId(spuId);
            if (skuIdsDb.contains(sku.getSkuId())) {
                updateSkus.add(sku);
                skuIdsDb.remove(sku.getSkuId());
            } else if (sku.getSkuId() == null) {
                insertSkus.add(sku);
            }
        }
        // 新增的sku--保存
        if (CollUtil.isNotEmpty(insertSkus)) {
            proxy.addSkus(spuId, insertSkus);
        }
        // 已有的sku--更新
        if (CollUtil.isNotEmpty(updateSkus)) {
            baseMapper.updateBatch(updateSkus);
            skuStockService.updateBatch(updateSkus);
            spuSkuAttrValueService.updateBatchBySpuId(spuId, updateSkus);
        }
        // 删除的sku--删除
        if (CollUtil.isNotEmpty(skuIdsDb)) {
            baseMapper.removeBatchIds(skuIdsDb);
        }
    }

    @Override
    public void removeBySpuId(Long id) {
        baseMapper.removeBySpuId(id);
    }
}
